#pragma GCC optimize(2)
#include <iostream>
#include <queue>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <unordered_set>
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
int a[50];
struct node
{
	int a;
	int b;
}k[50];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		int mi=25;
		int ma=-25;
		int r=0;
		int l=0;
		int p1=0;
		int p2=0;
		int f2=0;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			if(a[i]>ma)
			{
				ma=a[i];
				p1=i;
			}
			if(a[i]<mi)
			{
				mi=a[i];
				p2=i;
			}
			if(a[i]>=1) f2=1;
			if(a[i]>0) r++;
			else l++;
		}
		int f=0;
		int cnt=0;
		int cma=ma;
		int idx=0;
		if(f2!=0)
		{
			while(cma<abs(mi))
		{
			cma*=2;
			idx++;
			k[idx]={p1,p1};
		}
		if(idx+l+n-1<=31) f=1;
		}
		
		
		
		if(f)
		{
			a[p1]=cma;
			for(int i=1;i<=n;i++)
			{
				if(a[i]<0)
				{
					idx++;
					k[idx]={i,p1};
					a[i]+=a[p1];
				}
			}
			for(int i=1;i<=n-1;i++)
			{
				if(a[i]>a[i+1])
				{
					idx++;
					k[idx]={i+1,i};
					a[i+1]+=a[i];
				}
			}
		}
		else
		{
			idx=0;
			while(abs(a[p2])<a[p1])
			{
				a[p2]*=2;
				idx++;
				k[idx]={p2,p2};
			}
			for(int i=1;i<=n;i++)
			{
				if(a[i]>0)
				{
					idx++;
					k[idx]={i,p2};
					a[i]+=a[p2];
				 } 
			}
			for(int i=n;i>=2;i--)
			{
				if(a[i]<a[i-1])
				{
					idx++;
					k[idx]={i-1,i};
					a[i-1]+=a[i];
				}
			}
		}
		cout<<idx<<endl;
		for(int i=1;i<=idx;i++)
		{
			cout<<k[i].a<<' '<<k[i].b<<endl;
		}
	}

	return 0;
}

